package com.aboo.util;

import java.text.ParseException;
import java.util.Calendar;
import java.util.Date;

import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.apache.log4j.Logger;

/**
 * @author Yata Aboo
 * @Date 2012-9-19
 * @Desc 日期、时间工具包
 */
public class DateUtil {
	
	private static final Logger logger = Logger.getLogger(DateUtil.class);

	/**
	 * 获取指定格式的当前时间
	 * @param pattern 时间格式，例如yyyyMMddHHmmss、yyyy-MM-dd HH:mm:ss
	 * @return 指定格式的当前时间
	 */
	public static String getDateTime(String pattern) {
		return DateFormatUtils.format(new Date(), pattern);
	}
	
	/**
	 * 获取指定格式的当前时间
	 * @param date 待转换的时间
	 * @param pattern 时间格式，例如yyyyMMddHHmmss、yyyy-MM-dd HH:mm:ss
	 * @return 指定格式的当前时间
	 */
	public static String getDateTime(Date date, String pattern) {
		return DateFormatUtils.format(date, pattern);
	}
	
	/**
	 * 获取Date类型时间
	 * @param strDate String类型时间
	 * @param pattern 时间格式
	 * @return Date类型时间
	 */
	public static Date getDate(String strDate, String pattern) {
		Date date = null;
		try {
			date = DateUtils.parseDate(strDate, pattern);
		} catch (ParseException e) {
			logger.error("日期值处理出错!", e);
		}
		return date;
	}
	
	/**
	 * 获取HHmmss格式的当前时分秒
	 * @return HHmmss格式的当前时分秒
	 */
	public static String getChar6() {
		return DateFormatUtils.format(new Date(), "HHmmss");
	}
	
	/**
	 * 获取yyyyMMdd格式的当前年月日
	 * @return yyyyMMdd格式的当前年月日
	 */
	public static String getChar8() {
		return DateFormatUtils.format(new Date(), "yyyyMMdd");
	}

	/**
	 * 获取yyyyMMddHHmmss格式的当前年月日时分秒
	 * @return yyyyMMddHHmmss格式的当前年月日时分秒
	 */
	public static String getChar14() {
		return DateFormatUtils.format(new Date(), "yyyyMMddHHmmss");
	}
	
	/**
	 * 获取HHmmss格式的当前时分秒
	 * @param date 待转换的时间
	 * @return HHmmss格式的当前时分秒
	 */
	public static String getChar6(Date date) {
		return DateFormatUtils.format(date, "HHmmss");
	}
	
	/**
	 * 获取yyyyMMdd格式的当前年月日
	 * @param date 待转换的时间
	 * @return yyyyMMdd格式的当前年月日
	 */
	public static String getChar8(Date date) {
		return DateFormatUtils.format(date, "yyyyMMdd");
	}

	/**
	 * 获取yyyyMMddHHmmss格式的当前年月日时分秒
	 * @param date 待转换的时间
	 * @return yyyyMMddHHmmss格式的当前年月日时分秒
	 */
	public static String getChar14(Date date) {
		return DateFormatUtils.format(date, "yyyyMMddHHmmss");
	}
	
	/**
	 * 获取调整天数后的时间
	 * @param srcDate 时间值
	 * @param pattern 时间格式
	 * @param addDay 向后调整的天数数（向前调整取负值）
	 * @return 调整天数后的时间
	 */
	public static String addDay(String srcDate, String pattern, int addDay) {		
		Date date = null;
		try {
			date = DateUtils.parseDate(srcDate, pattern);
			date = DateUtils.addDays(date, addDay);
		} catch (ParseException e) {
			logger.error("日期值处理出错!", e);
		}				
		return DateFormatUtils.format(date, pattern);
	}
	
	/**
	 * 获取调整月份后的时间
	 * @param srcDate 时间值
	 * @param pattern 时间格式
	 * @param addMonth 向后调整的月份数（向前调整取负值）
	 * @return 调整月份后的时间
	 */
	public static String addMonth(String srcDate, String pattern, int addMonth) {		
		Date date = null;
		try {
			date = DateUtils.parseDate(srcDate, pattern);
			date = DateUtils.addMonths(date, addMonth);
		} catch (ParseException e) {
			logger.error("日期值处理出错!", e);
		}				
		return DateFormatUtils.format(date, pattern);
	}
	
	/**
	 * 获取调整年数后的时间
	 * @param srcDate 时间值
	 * @param pattern 时间格式
	 * @param addYear 向后调整的年数数（向前调整取负值）
	 * @return 调整年数后的时间
	 */
	public static String addYear(String srcDate, String pattern, int addYear) {		
		Date date = null;
		try {
			date = DateUtils.parseDate(srcDate, pattern);
			date = DateUtils.addYears(date, addYear);
		} catch (ParseException e) {
			logger.error("日期值处理出错!", e);
		}				
		return DateFormatUtils.format(date, pattern);
	}
	
	/**
	 * 获取当前月的第一天时间
	 * @param pattern 时间格式
	 * @return 当前月的第一天时间
	 */
	public static String getFirstDayOfMonth(String pattern) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(new Date());
		calendar.set(Calendar.DAY_OF_MONTH, 1);
		return DateFormatUtils.format(calendar, pattern);
	}
	
	/**
	 * 获取当前月的最后一天时间
	 * @param pattern 时间格式
	 * @return 当前月的最后一天
	 */
	public static String getLastDayOfMonth(String pattern) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(new Date());
		calendar.set(Calendar.DAY_OF_MONTH, 1);
		calendar.add(Calendar.MONTH, 1);		
		calendar.add(Calendar.DATE, -1);
		return DateFormatUtils.format(calendar, pattern);
	}
	
	/**
	 * 获取当前周的第一天时间
	 * @param pattern 时间格式
	 * @return 当前周的第一天时间
	 */
	public static String getFirstDayOfWeek(String pattern) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(new Date());
		calendar.set(Calendar.DAY_OF_WEEK, 2);
		return DateFormatUtils.format(calendar, pattern);
	}
	
	/**
	 * 获取当前周的最后一天时间
	 * @param pattern 时间格式
	 * @return 当前周的最后一天时间
	 */
	public static String getLastDayOfWeek(String pattern) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(new Date());
		calendar.add(Calendar.WEEK_OF_YEAR, 1);
		calendar.set(Calendar.DAY_OF_WEEK, 1);
		return DateFormatUtils.format(calendar, pattern);
	}
	
}
